const express = require('express')
const cors = require('cors')
const app = express()
// 验证表单数据
const joi = require('@hapi/joi')


// 用于生成加密token jwt 相关的两个包
const jwt = require('jsonwebtoken')
const expressJwt = require('express-jwt')


const secreKey = 'haotongxue |>>'

app.use(cors())
// 配置解析表单数据的中间件
app.use(express.urlencoded({extended:false}))
// unless 设置不需要访问权限的页面
// 只要配置好了express-jwt 这个中间件，就可以把解析出来的用户信息，挂载到req.user 属性上
app.use(expressJwt({secret:secreKey,algorithms:['HS256']}).unless({path:[/^\/api\//]}))
app.use(express.urlencoded({ extended: false }))
// 响应数据的中间件
app.use(function (req, res, next) {
    // status = 0 为成功； status = 1 为失败； 默认将 status 的值设置为 1，方便处理失败的情况
    res.cc = function (err, status = 1) {
      res.send({
        // 状态
        status,
        // 状态描述，判断 err 是 错误对象 还是 字符串
        message: err instanceof Error ? err.message : err,
      })
    }
    next()
  })
// 全局错误中间件 处理token等异常处理
app.use((err,req,res,next)=>{
    // 这次错误时候token解析失败导致的
    console.log(req)
    console.log(err.name)
    if(err.name === "UnauthorizedError"){
        return res.send({
            status:401,
            msg:'登录过期请重新登陆'
        })
    }
    res.send({
        status:500,
        msg:'未知的错误！'
    })
})

const userRouter = require('./router/user')
app.use('/api',userRouter)
const newsListRouter = require('./router/newList')
app.use(newsListRouter)

// 定义错误级别的中间件
app.use((err,req,res,next)=>{
    // 验证失败导致的错误
    if(err instanceof joi.ValidationError) res.cc(err)
    // 未知的错误
    res.cc(err)
})
// 启动服务器
app.listen(8888,()=>{
    console.log("server at http:127.0.0.1:8888")
})